/*
author: TangQiao @ Wind 

	problem name: Radar Installation
	source : BNU ONLINE JUDEG
	problem type: 贪心法
	problem description: 用最少的雷达站把所有小岛都盖。
	problem solution: 
	 １．按Ｘ坐标排序．
	每次选一个最左边的点，然后按顺序检查后边的点是否可以包含在当前的点所包的边上（说得有点复杂，其实很简单）．
	这样按从左到右的顺序处理，如果包不到就说明需要一个新的Radar，这样生就可以得到正解了．
	２．按最右范围排序．(我的做法)
	排好序后选一个最左边的点,然后把所有点中的左边包在当前选的右边界的情况就可以用一个雷达包括.
	然后再从没有被包括的点中再选一个点,重复以上操作.

	ＮＯＴＥ：
	排序最好用ＱＳＯＲＴ进行排序．标程用qsort只用了31MS.

	date : 2005.7.2 北师大校队训练
	
*/
#include <stdio.h>
#include <string.h>
#include <math.h>

struct diantype
{
	int x,y;
	double left,right;
	int done;
}dian[2000];

int n,d;
int count;
int icase;

int findone(int &a)
{
	int i;
	for (i=1;i<=n;i++) 
		if (dian[i].done==0) 
		{
			a=i;
			return 1;
		}
	return 0;
}


main()
{
	int i,j;
	int dd;
	double cha;
	icase=0;
	while (1)
	{
		scanf("%d%d", &n, &d);
		if (n==0 && d==0) break;

		for (i=1;i<=n;i++)
		{
			scanf("%d%d", &dian[i].x, &dian[i].y);
			dian[i].left=dian[i].right=dian[i].done=0;
		}

//		for (i=1;i<=n;i++) printf("x=%d y=%d", dian[i].x,dian[i].y);

		int flag=0;
		for (i=1;i<=n;i++)
		{
			if (dian[i].y>d) 
			{
				printf("Case %d: -1\n", ++icase);
				flag=1;
				break;
			}
		}
		if (flag) continue;

		


		for (i=1,dd=d*d;i<=n;i++)
		{
			cha=sqrt(dd-dian[i].y*dian[i].y);
			dian[i].left=dian[i].x-cha;
			dian[i].right=dian[i].x+cha;
		}

		for (i=1;i<=n-1;i++)
			for (j=i+1;j<=n;j++)
				if (dian[i].right>dian[j].right)
				{
					dian[0]=dian[i];
					dian[i]=dian[j];
					dian[j]=dian[0];
				}
		


		count=0;
		double max;
		int a;
		
		while (findone(a))
		{
			max=dian[a].right;
			dian[a].done=1;
			for (i=1;i<=n;i++)
				if (max-dian[i].left>=1e-6 || fabs(max-dian[i].left)<=1e-6)
				{
					dian[i].done=1;
				}

			count++;
		}

		printf("Case %d: %d\n", ++icase, count);




	}
	

	return 0;
}
